﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using GestionWeb.Models;
using GestionWeb.Excepciones;
using System.ServiceModel;

namespace GestionWeb.Controllers
{
    public class ProductoController : Controller
    {

        private ProductosMS.Producto[] CrearProductos()
        {

            ProductosMS.ProductosClient obj = new ProductosMS.ProductosClient();
            ProductosMS.Producto[] productosLista = obj.ListarProducto();

            return productosLista;
        }

        public ActionResult Index()
        {
            return View(CrearProductos());
        }

        public ActionResult Details(int id)
        {
            ProductosMS.ProductosClient obj = new ProductosMS.ProductosClient();
            ProductosMS.Producto producto = obj.ObtenerProducto(id);

            return View(producto);
        }

        public ActionResult Create()
        {
            ProductosMS.ProductosClient obj = new ProductosMS.ProductosClient();

            List<ProductosMS.Usuario> UsuarioList = new List<ProductosMS.Usuario>();
            UsuarioList = obj.ListarUsuario().ToList<ProductosMS.Usuario>();
            ViewData["dsUsuario"] = new SelectList(UsuarioList, "Codigo", "Cuenta");

            List<ProductosMS.Marca> MarcaList = new List<ProductosMS.Marca>();
            MarcaList = obj.ListarMarca().ToList<ProductosMS.Marca>();
            ViewData["dsMarca"] = new SelectList(MarcaList, "Codigo", "Descripcion");
            
            List<ProductosMS.TipoProducto> TipoProductoList = new List<ProductosMS.TipoProducto>();
            TipoProductoList = obj.ListarTipoProducto().ToList<ProductosMS.TipoProducto>();
            ViewData["dsTipoProducto"] = new SelectList(TipoProductoList, "Codigo", "Descripcion");
            
            return View();
        }

        [HttpPost]
        public ActionResult Create(FormCollection collection, string dsUsuarioList, string dsMarcaList, string dsTipoProductoList)
        {
            try
            {
                ProductosMS.ProductosClient obj = new ProductosMS.ProductosClient();

                ProductosMS.Producto producto = obj.CrearProducto(
                    DateTime.Today,
                    int.Parse(dsUsuarioList),
                    0,
                    collection["EAN"],
                    collection["Denominacion"],
                    int.Parse(dsMarcaList),
                    collection["Medida"],
                    collection["Descripcion"],
                    int.Parse(dsTipoProductoList)
                    );

                return RedirectToAction("Index");
            }
            catch (FaultException<ValidationException> ex) 
            {
                ViewData["Error"] = ex.Message;

                ProductosMS.ProductosClient obj = new ProductosMS.ProductosClient();

                List<ProductosMS.Usuario> UsuarioList = new List<ProductosMS.Usuario>();
                UsuarioList = obj.ListarUsuario().ToList<ProductosMS.Usuario>();
                ViewData["dsUsuario"] = new SelectList(UsuarioList, "Codigo", "Cuenta");

                List<ProductosMS.Marca> MarcaList = new List<ProductosMS.Marca>();
                MarcaList = obj.ListarMarca().ToList<ProductosMS.Marca>();
                ViewData["dsMarca"] = new SelectList(MarcaList, "Codigo", "Descripcion");

                List<ProductosMS.TipoProducto> TipoProductoList = new List<ProductosMS.TipoProducto>();
                TipoProductoList = obj.ListarTipoProducto().ToList<ProductosMS.TipoProducto>();
                ViewData["dsTipoProducto"] = new SelectList(TipoProductoList, "Codigo", "Descripcion");

                return View();
            }
            catch (Exception ex)
            {
                ViewData["Error"] = ex.Message;

                ProductosMS.ProductosClient obj = new ProductosMS.ProductosClient();

                List<ProductosMS.Usuario> UsuarioList = new List<ProductosMS.Usuario>();
                UsuarioList = obj.ListarUsuario().ToList<ProductosMS.Usuario>();
                ViewData["dsUsuario"] = new SelectList(UsuarioList, "Codigo", "Cuenta");

                List<ProductosMS.Marca> MarcaList = new List<ProductosMS.Marca>();
                MarcaList = obj.ListarMarca().ToList<ProductosMS.Marca>();
                ViewData["dsMarca"] = new SelectList(MarcaList, "Codigo", "Descripcion");

                List<ProductosMS.TipoProducto> TipoProductoList = new List<ProductosMS.TipoProducto>();
                TipoProductoList = obj.ListarTipoProducto().ToList<ProductosMS.TipoProducto>();
                ViewData["dsTipoProducto"] = new SelectList(TipoProductoList, "Codigo", "Descripcion");

                return View();
            }
        }

        public ActionResult Edit(int id)
        {
            ProductosMS.ProductosClient obj = new ProductosMS.ProductosClient();
            ProductosMS.Producto producto = obj.ObtenerProducto(id);

            List<ProductosMS.Marca> MarcaList = new List<ProductosMS.Marca>();
            MarcaList = obj.ListarMarca().ToList<ProductosMS.Marca>();
            ViewData["dsMarca"] = new SelectList(MarcaList, "Codigo", "Descripcion", producto.Marca.Codigo);

            List<ProductosMS.TipoProducto> TipoProductoList = new List<ProductosMS.TipoProducto>();
            TipoProductoList = obj.ListarTipoProducto().ToList<ProductosMS.TipoProducto>();
            ViewData["dsTipoProducto"] = new SelectList(TipoProductoList, "Codigo", "Descripcion", producto.Tipo.Codigo);

            return View(producto);
        }

        [HttpPost]
        public ActionResult Edit(int id, FormCollection collection, string dsUsuarioList, string dsMarcaList, string dsTipoProductoList)
        {

            try
            {
                ProductosMS.ProductosClient obj = new ProductosMS.ProductosClient();
                ProductosMS.Producto productoExistente = obj.ObtenerProducto(id);

                ProductosMS.Producto producto = obj.ModificarProducto(
                    id,
                    productoExistente.Creacion,
                    productoExistente.Usuario.Codigo,
                    productoExistente.Estado,
                    collection["EAN"],
                    collection["Denominacion"],
                    int.Parse(dsMarcaList),
                    collection["Medida"],
                    collection["Descripcion"],
                    int.Parse(dsTipoProductoList)
                    );

                return RedirectToAction("Index");
            }
            catch (FaultException<ValidationException> ex)
            {
                ViewData["Error"] = ex.Message;

                ProductosMS.ProductosClient obj = new ProductosMS.ProductosClient();
                ProductosMS.Producto producto = obj.ObtenerProducto(id);

                List<ProductosMS.Marca> MarcaList = new List<ProductosMS.Marca>();
                MarcaList = obj.ListarMarca().ToList<ProductosMS.Marca>();
                ViewData["dsMarca"] = new SelectList(MarcaList, "Codigo", "Descripcion");

                List<ProductosMS.TipoProducto> TipoProductoList = new List<ProductosMS.TipoProducto>();
                TipoProductoList = obj.ListarTipoProducto().ToList<ProductosMS.TipoProducto>();
                ViewData["dsTipoProducto"] = new SelectList(TipoProductoList, "Codigo", "Descripcion");

                return View(producto);
            }
            catch (Exception ex)
            {
                ViewData["Error"] = ex.Message;

                ProductosMS.ProductosClient obj = new ProductosMS.ProductosClient();
                ProductosMS.Producto producto = obj.ObtenerProducto(id);

                List<ProductosMS.Marca> MarcaList = new List<ProductosMS.Marca>();
                MarcaList = obj.ListarMarca().ToList<ProductosMS.Marca>();
                ViewData["dsMarca"] = new SelectList(MarcaList, "Codigo", "Descripcion");

                List<ProductosMS.TipoProducto> TipoProductoList = new List<ProductosMS.TipoProducto>();
                TipoProductoList = obj.ListarTipoProducto().ToList<ProductosMS.TipoProducto>();
                ViewData["dsTipoProducto"] = new SelectList(TipoProductoList, "Codigo", "Descripcion");

                return View(producto);
            }
        }

        public ActionResult Delete(int id)
        {
            ProductosMS.ProductosClient obj = new ProductosMS.ProductosClient();
            ProductosMS.Producto producto = obj.ObtenerProducto(id);

            return View(producto);
        }

        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            try
            {
                ProductosMS.ProductosClient obj = new ProductosMS.ProductosClient();
                obj.EliminarProducto(id);

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

    }
}
